package com.cat.dataStructure03;

/**
 * @author 曲大人的喵
 * @description https://leetcode.cn/problems/count-subarrays-with-fixed-bounds/
 * @create 2025/11/13 16:13
 * @since JDK17
 */

public class Solution54 {
    public long countSubarrays(int[] nums, int minK, int maxK) {
        // 子数组的范围只能限定在某些区域里面
        // 可以把[minK, maxK]之外的数字当作是子数组的分割点
        // 双指针 : 子数组等价于左右两个端点, 枚举右端点看左端点能在哪些范围内
        long ans = 0;
        int n = nums.length, minI = -1, maxI = -1, last = -1;
        for (int i = 0; i < n; i++) {
            if (nums[i] == minK) {
                minI = i;
            }
            if (nums[i] == maxK) {
                maxI = i;
            }
            if (nums[i] < minK || nums[i] > maxK) {
                last = i;
            }
            ans += Math.max(Math.min(minI, maxI) - last, 0);
        }

        return ans;
    }
}
